package main

import "fmt"

// 利用 any (interface 的别名) 实现通用函数的方案
// 缺点：
// 1. 若要支持新的数据类型，需要修改原函数
// 2. 返回值是 any 类型，若要得到实际类型的值还需要通过类型断言进行转换
// 3. any 作为输入参数和返回值的类型，存在装箱和拆箱的操作，性能与 maxInt() 相比慢上数倍

func maxAny(sl []any) any {
	if len(sl) <= 0 {
		panic("slice is empty")
	}

	max := sl[0]
	for _, v := range sl[1:] {
		switch v.(type) {
		case int:
			if v.(int) > max.(int) {
				max = v
			}
		case string:
			if v.(string) > max.(string) {
				max = v
			}
		case float64:
			if v.(float64) > max.(float64) {
				max = v
			}
		}
	}

	return max
}

func main() {
	max := maxAny([]any{1, 3, 5, 7, 9, 2, 4, 6, 8, 10})
	// var n int = max  // 编译器报错：need type assertion
	i := max.(int)
	fmt.Printf("%T %d\n", max, i)
}
